import java.lang.reflect.Constructor;

public class AccessPersonConstructors {
    public static void main(String[] args) {
        try {
            // 加载Person类
            Class clz = Class.forName("entity.Person");
            // 调用Person类的无参构造创建Person类实例
            Object obj = clz.newInstance();

            // 获取Person的无参构造: public Person()
            Constructor c1 = clz.getDeclaredConstructor();
            // Person的无参构造为public,这里可以直接访问
            obj = c1.newInstance();
            System.out.println(obj);

            // 获取Person的单参数构造: private Person(String)
            Constructor c2 = clz.getDeclaredConstructor(String.class);
            // Person的单参数构造为private,这里已超出其访问范围,不能直接访问
            // 通过setAccessable方法,设定为可以访问
            c2.setAccessible(true);
            obj = c2.newInstance("New Person");
            System.out.println(obj);

            // 获取Person的三参构造
            Constructor c3 = clz.getDeclaredConstructor(String.class,String.class,String.class);
            // Person的三参构造为protected,这里已超出其访问范围,不能直接访问
            // 通过setAccessable方法, 设定为可以访问
            c3.setAccessible(true);
            obj = c3.newInstance("New Person","beijing","Hello!");
            System.out.println(obj);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
